﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Csla;
using Csla.Data;
using System.ComponentModel.DataAnnotations;

namespace Sireass.Bl
{
    [Serializable]
    public class InformeInfo : ReadOnlyBase<InformeInfo>
    {
        #region Propiedades
        public static readonly PropertyInfo<long> IdInformeProperty = RegisterProperty<long>(c => c.IdInforme);
        [Display(Name = "Id del Informe")]
        public long IdInforme
        {
            get { return GetProperty(IdInformeProperty); }
            private set { LoadProperty(IdInformeProperty, value); }
        }

        public static readonly PropertyInfo<long> IdAsignacionProperty = RegisterProperty<long>(c => c.IdAsignacion);
        [Display(Name = "Id de la asignación")]
        public long IdAsignacion
        {
            get { return GetProperty(IdAsignacionProperty); }
            private set { LoadProperty(IdAsignacionProperty, value); }
        }

        public static readonly PropertyInfo<byte> IdEstatusInformeProperty = RegisterProperty<byte>(c => c.IdEstatusInforme);
        [Display(Name = "Id del estatus del informe")]
        public byte IdEstatusInforme
        {
            get { return GetProperty(IdEstatusInformeProperty); }
            private set { LoadProperty(IdEstatusInformeProperty, value); }
        }

        public static readonly PropertyInfo<string> AportacionProperty = RegisterProperty<string>(c => c.Aportacion);
        [Display(Name = "Aportacion")]
        public string Aportacion
        {
            get { return GetProperty(AportacionProperty); }
            private set { LoadProperty(AportacionProperty, value); }
        }
        public static readonly PropertyInfo<string> PoblacionBeneficiadaProperty = RegisterProperty<string>(c => c.PoblacionBeneficiada);
        [Display(Name = "Poblacion beneficiada")]
        public string PoblacionBeneficiada
        {
            get { return GetProperty(PoblacionBeneficiadaProperty); }
            private set { LoadProperty(PoblacionBeneficiadaProperty, value); }
        }
        public static readonly PropertyInfo<string> ObservacionesProperty = RegisterProperty<string>(c => c.Observaciones);
        [Display(Name = "Observaciones")]
        public string Observaciones
        {
            get { return GetProperty(ObservacionesProperty); }
            private set { LoadProperty(ObservacionesProperty, value); }
        }

        public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
        [Display(Name = "Habilitado")]
        public bool Habilitado
        {
            get { return GetProperty(HabilitadoProperty); }
            private set { LoadProperty(HabilitadoProperty, value); }
        }
        public static readonly PropertyInfo<DateTime> FechaRegistroProperty = RegisterProperty<DateTime>(c => c.FechaRegistro);
        [Display(Name = "Fecha Registro")]
        public DateTime FechaRegistro
        {
            get { return GetProperty(FechaRegistroProperty); }
            private set { LoadProperty(FechaRegistroProperty, value); }
        }
        public static readonly PropertyInfo<DateTime> FechaActualizacionProperty = RegisterProperty<DateTime>(c => c.FechaActualizacion);
        [Display(Name = "Fecha Actualizacion")]
        public DateTime FechaActualizacion
        {
            get { return GetProperty(FechaActualizacionProperty); }
            private set { LoadProperty(FechaActualizacionProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaVoBoProperty = RegisterProperty<DateTime>(c => c.FechaVoBo);
        [Display(Name = "Fecha VoBo")]
        public DateTime FechaVoBo
        {
            get { return GetProperty(FechaVoBoProperty); }
            private set { LoadProperty(FechaVoBoProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaAutorizadoProperty = RegisterProperty<DateTime>(c => c.FechaAutorizado);
        [Display(Name = "Fecha Autorizado")]
        public DateTime FechaAutorizado
        {
            get { return GetProperty(FechaAutorizadoProperty); }
            private set { LoadProperty(FechaAutorizadoProperty, value); }
        }

        //public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
        //[Display(Name = "Fecha Alta")]
        //public DateTime FechaAlta
        //{
        //    get { return GetProperty(FechaAltaProperty); }
        //    set { LoadProperty(FechaAltaProperty, value); }
        //}

        public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
        [Display(Name = "Fecha Baja")]
        public DateTime FechaBaja
        {
            get { return GetProperty(FechaBajaProperty); }
            private set { LoadProperty(FechaBajaProperty, value); }
        }

        #endregion

        #region Factory

        public static InformeInfo GetInformeInfo(InformeCriteria criteria)
        {
            return DataPortal.Fetch<InformeInfo>(criteria);
        }
        #endregion

        #region Métodos
        public static void AddObjectAuthorizationRules()
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
            PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
            List<string> roles = new List<string>(perfilesPorServicio.Count);
            foreach (PerfilServicioInfo perfilServicio in perfilesPorServicio)
            {
                roles.Add(perfilServicio.Perfil);
            }
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
        }

        #endregion

        #region DataPortal
        private void Child_Fetch(System.Data.IDataReader data)
        {
            var safeData = new SafeDataReader(data);
            IdInforme = safeData.GetInt64("nId_Informe");
            IdAsignacion = safeData.GetInt64("nId_Asignacion");
            IdEstatusInforme = safeData.GetByte("nId_Estatus_Informe");
            Aportacion = safeData.GetString("cAportacion");
            PoblacionBeneficiada = safeData.GetString("cPoblacionBeneficiada");
            Observaciones = safeData.GetString("cObservaciones");
            Habilitado = safeData.GetBoolean("bHabilitado");
            FechaRegistro = safeData.GetDateTime("dFecha_Registro");
            FechaActualizacion = safeData.GetDateTime("dFecha_Actualizacion");
            FechaVoBo = safeData.GetDateTime("dFecha_VoBo");
            FechaAutorizado = safeData.GetDateTime("dFecha_Autorizado");
            FechaBaja = safeData.GetDateTime("dFecha_Baja");
        }

		private void DataPortal_Fetch(InformeCriteria criteria)
		{
			using (var dalManager = Sireass.Dal.DalFactory.GetManager())
			{
				var dal = dalManager.GetProvider<Sireass.Dal.IInformeDal>();
				using (var data = new Csla.Data.SafeDataReader(dal.Fetch(criteria.IdInforme,criteria.IdAsignacion, criteria.IdEstatusInforme)))
				{
					if (data.Read())
					{
                        IdInforme = data.GetInt64("nId_Informe");
                        IdAsignacion = data.GetInt64("nId_Asignacion");
                       IdEstatusInforme = data.GetByte("nId_Estatus_Informe");
                        Aportacion = data.GetString("cAportacion");
                        PoblacionBeneficiada = data.GetString("cPoblacionBeneficiada");
                        Observaciones = data.GetString("cObservaciones");
                        Habilitado = data.GetBoolean("bHabilitado");
                        FechaRegistro = data.GetDateTime("dFecha_Registro");
                        FechaActualizacion = data.GetDateTime("dFecha_Actualizacion");
                        FechaVoBo = data.GetDateTime("dFecha_VoBo");
                        FechaAutorizado = data.GetDateTime("dFecha_Autorizado");
                        FechaBaja = data.GetDateTime("dFecha_Baja");
					}
				}
			}
		}
        #endregion


    }
}
